home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 201_01 / ansisys2.c < prev    next >
Text File  |  1980-01-01  |  14KB  |  284 lines

  1. /** ansisys.c
  2. *
  3. *   ANSISYS.C
  4. *   (C) Copyright 1985 Don F. Ridgway
  5. *   All rights reserved.
  6. *   This program may be copied for
  7. *   personal, non-profit use only.
  8. *
  9. *   This is an original and unique C programming
  10. *   language header/function file to #include with
  11. *   your C programs to give them "smart" cursor
  12. *   control and eye-catching "turtlegraphics"-
  13. *   type screen and graphics display qualities.
  14. *
  15. *   Programmed by:
  16. *   Don F. Ridgway
  17. *   Owner & Chief Programmer/Analyst
  18. *   A-1 IBM Programming & Training Service
  19. *   CUSTOM BUSINESS PROGRAMS
  20. *   119 Plantation Ct., Suite D
  21. *   Temple Terrace, FL  33617-3731
  22. *   Ph: (813) 985-3342  (10:00 am - 2:00 pm EST)
  23. *
  24. *   Written, compiled & tested in Microsoft C,
  25. *   ver. 2.03, and Lattice C, vers. 2.15 & 3.00, under
  26. *   PC-DOS 2.1 & 3.1 on a Compaq w/640Kb RAM & 8087, using
  27. *   the TURBO Pascal 3.0 screen editor.  (260+ lines.)
  28. *
  29. *   NOTE:  To utilize these macros you must have: (1) The
  30. *   ANSI.SYS file that came with your PC-DOS or MS-DOS 2.xx
  31. *   operating system on your boot disk and, (2) you must boot
  32. *   up with a CONFIG.SYS file on that boot disk which
  33. *   contains the statement: DEVICE = ANSI.SYS.  This loads
  34. *   the ANSI.SYS device driver into DOS at bootup time.  The
  35. *   operating system searches (for) CONFIG.SYS before it looks
  36. *   for an AUTOEXEC.BAT file.  Please refer to your DOS
  37. *   Reference Guide under "ANSI.SYS" and "COPY" for details.
  38. *
  39. *   (Simply, at A> prompt on a boot diskette, type:
  40. *                 COPY CON:CONFIG.SYS<cr>
  41. *                 DEVICE=ANSI.SYS<cr>
  42. *                 <F6><cr>
  43. *   and then reboot and you're ready to go!  Small bother
  44. *   for the brilliant performance gained in your C programs--
  45. *   just have these two files, ANSI.SYS and CONFIG.SYS, on
  46. *   your boot disk whenever you boot up.)
  47. *
  48. *   (The diskette these programs are sent to you on is a
  49. *   PC-DOS 2.1 boot disk so you may boot up with it and run
  50. *   ANSIDEMO.EXE.  Note the ANSI.SYS and CONFIG.SYS files.)
  51. *
  52. *   This custom C module/header file connects the C programming
  53. *   language to the MS-DOS/PC-DOS "ANSI.SYS" device driver
  54. *   used to implement extended screen and keyboard functions.
  55. *   Like any C program, each of the following macros can itself
  56. *   become a building block for a still larger one.  Note the
  57. *   evolution of WINDOW(row1,col1,row2,col2,fill,border) from
  58. *   DRAW(row1,col1,row2,col2,icon) and FILL(row1,col1,row2,col2,fill).
  59. *
  60. *   Please refer to the MS-DOS/PC-DOS Reference Manual and the
  61. *   ANSI.SYS Device Driver commands for the "original" commands
  62. *   and control sequences that are here made into C macros.
  63. *
  64. *   Refer to the IBM Technical Reference Manual or to the
  65. *   appendix of the BASIC Version 2 Reference for the ASCII
  66. *   Character Codes and the Extended Keyboard Function codes.
  67. *
  68. *   Run the ANSIDEMO.EXE for a superb demonstration of all these
  69. *   powerful macros and C programming tools in action.  The
  70. *   actual source code is included in ANSIDEMO.C, an excellent
  71. *   demonstration/introduction to the C programming language.
  72. *
  73. *   Simply #include "ansisys.c" this file in your programs
  74. *   to enable the following "smart" screen and cursor commands
  75. *   to really supercharge your C programs with professional
  76. *   features that are easier, safer and more portable than
  77. *   tacked-on assembly languge routines.
  78. *
  79. *   Remember that C is "case sensitive" so be sure and
  80. *   reference the following macros with CAPITAL LETTERS.
  81. *
  82. **/
  83.  
  84. #define BEEP                           printf("\007")
  85.         /* 800 Mz tone for 1/4 second -- same as PRINT CHR$(7) */
  86. #define CLEARSCREEN                    printf("\033[2J")
  87. #define CLS                            CLEARSCREEN
  88.         /* clears the screen and positions cursor at top left corner */
  89.         /* "\033" is Octal for "Escape" or ASCII Decimal 27  (CHR$(27)) */
  90.         /* "Escape-[" is the lead-in for the ANSI.SYS code routines */
  91. #define CURSPOS(x,y)                   printf("\033[%u;%uH",(x),(y))
  92. #define XY(x,y)                        CURSPOS(x,y)
  93.         /* positions cursor at x = row, y = column */
  94. #define EOL                            printf("\033[K")
  95.         /* erases to end of line, including cursor position */
  96.         /* NOTE:  error in DOS documentation has 'K' lower case */
  97. #define XYEOL(x,y)                     printf("\033[%u;%uH\033[K",(x),(y))
  98.         /* positions cursor at x,y then erases to end of line */
  99. #define XYWHERE        printf("\033[6n");scanf("%*1c%2d%*1c%2d%*2c",&row,&col)
  100.         /* requests cursor position, device driver answers row,col--declare int */
  101. #define CURSUP(x)                      printf("\033[%uA",(x))
  102. #define CURSDWN(x)                     printf("\033[%uB",(x))
  103.         /* cursor up or down x-many lines */
  104. #define CURSFWD(y)                     printf("\033[%uC",(y))
  105. #define CURSBCK(y)                     printf("\033[%uD",(y))
  106.         /* cursor forward (right) or backward (left) y-many spaces */
  107. #define SAVCURS                        printf("\033[s")
  108. #define RECALLCURS                     printf("\033[u")
  109.         /* cursor position is saved for later recall via RECALLCURS */
  110. #define CPR(x,y,z)                     printf("\033[%u;%uH%c",(x),(y),(z))
  111. #define XYCHAR(x,y,z)                  CPR(x,y,z)
  112.         /* position cursor at x,y and print char z (using ASCII code) */
  113. #define XCTRPRINTF(x,str)   printf("\033[%u;%uH%s",(x),((80-(strlen(str)-1))/2),str)
  114.         /* on row x, center (and printf) the string str (in double quotes) */
  115. #define CURSPOSPRTF(x,y,str)           printf("\033[%u;%uH%s",(x),(y),str)
  116. #define XYPRINTF(x,y,str)              CURSPOSPRTF(x,y,str)
  117.         /* at position x,y printf the string str (in double quotes) */
  118. #define XKREAD(x)                      x=0;x=bdos(1);if (bdos(11)) x=bdos(8)+128
  119.         /* extended code keyboard read, reads function keys, arrow keys, etc. */
  120.      /* NOTE:  Lattice C 2.15/3.00 bdos() works like this--others don't: caution */
  121. #define XKREADE(x)                     x=0;x=bdos(1);if (bdos(11)) x=bdos(1)+128
  122.         /* same as XKREAD(), except this one echoes the input on the screen */
  123. #define CHKBRK                          if (key==196) break
  124.         /* if F10 key was pressed, break out of loop */
  125. #define SETSCREEN(a)                   printf("\033[=%uh",a)
  126.      /* set screen graphics mode */
  127.      /* 0=40x25 monochrome,1=40x25 color,2=80x25 mono,3=80x25 color,        */
  128.      /* 4=320x200 color,5=320x200 mono,6=640x200 mono,7=enable word-wrap.   */
  129. #define RESETSCREEN(a)                 printf("\033[=%ul",a)
  130.      /* reset screen graphics mode */
  131.      /* the attributes are same as SETSCREEN(a) except 7=disables word-wrap */
  132. #define SETDISPLAY(a,b,c)              printf("\033[%u;%u;%um",a,b,c)
  133.      /* set screen display attributes and colors = (a,b,c) any order:       */
  134.      /* 0 = default, 1 = high intensity, 4 = underline,                     */
  135. /* 5=blinking,7=inverse,8=invisible (black-on-black),30=foreground black,   */
  136. /* 31=fore red,32=fore green,33=fore yellow,34=fore blue,35=fore magenta,   */
  137. /* 36=fore cyan,37=fore white,40=background black,41=back red,42=back green,*/
  138. /* 43=back yellow,44=back blue,45=back magenta,46=back cyan,47=back white.  */
  139. #define HLON                           SETDISPLAY(0,0,1)
  140.         /* set high light (high intensity) on */
  141. #define BLON                           SETDISPLAY(0,0,5)
  142.         /* set blinking on */
  143. #define HLOFF                          SETDISPLAY(0,0,0)
  144. #define BLOFF                          HLOFF
  145.         /* set high intensity, blink (and all other display attributes) to off */
  146. #define PROMPT(x,y,cc)            SETDISPLAY(0,0,7);printf("\033[%u;%uH",(x),(y));\
  147.                                        cc=getchar();SETDISPLAY(0,0,0)
  148.         /* at position x,y read inverse prompt for input cc */
  149. #define XKPROMPT(x,y,z)             HLON;XY((x),(y));printf(" \b");XKREAD(z);HLOFF
  150.         /* at position x,y read highlighted prompt for input z */
  151. #define WINDOW(a,b,c,d,e,f)            DRAW(a,b,c,d,f);FILL(a+1,b+2,c-1,d-2,e)
  152.         /* a rectangle determined by